#*********************************************************************************************************
# ezN32926 Makefile
# target -> ezN32926.elf
#           ezN32926.bin
#*********************************************************************************************************
SYLIXOS_BASE_PATH = E:\SylixOS\workspace\SylixOS-ARM926
TOOLCHAIN_PREFIX = arm-sylixos-eabi-
#*********************************************************************************************************
# configure area you can set the following config to you own system
# FPUFLAGS (-mfloat-abi=softfp -mfpu=vfpv3 ...)
# CPUFLAGS (-mcpu=arm920t ...)
# NOTICE: libsylixos, BSP and other kernel modules projects CAN NOT use vfp!
#*********************************************************************************************************
FPUFLAGS =
CPUFLAGS = -mcpu=arm926ej-s

CC  = $(TOOLCHAIN_PREFIX)gcc
CXX = $(TOOLCHAIN_PREFIX)g++
AS  = $(TOOLCHAIN_PREFIX)gcc
AR  = $(TOOLCHAIN_PREFIX)ar
LD  = $(TOOLCHAIN_PREFIX)g++
OC  = $(TOOLCHAIN_PREFIX)objcopy
SZ  = $(TOOLCHAIN_PREFIX)size

#*********************************************************************************************************
# debug options (debug or release)
#*********************************************************************************************************
DEBUG_LEVEL = debug

#*********************************************************************************************************
# symbol.c symbol.h path
#*********************************************************************************************************
SYMBOL_PATH = SylixOS/bsp

#*********************************************************************************************************
# do not change the following code
# buildin internal application source
#*********************************************************************************************************

#*********************************************************************************************************
# symbol.c
#*********************************************************************************************************
SYM_SRCS = $(SYMBOL_PATH)/symbol.c

#*********************************************************************************************************
# bsp src(s) file
#*********************************************************************************************************
BSP_SRCS = \
SylixOS/bsp/bspInit.c 				\
SylixOS/bsp/bspLib.c 				\
SylixOS/bsp/startup.S 				\

#*********************************************************************************************************
# drivers src(s) file
#*********************************************************************************************************
DRV_SRCS = \
									\
SylixOS/driver/w55fa92_system.c			\
SylixOS/driver/w55fa92_power.c			\
SylixOS/driver/w55fa92_timer.c			\
SylixOS/driver/w55fa92_uart.c			\
SylixOS/driver/w55fa92_interrupt.c		\



#*********************************************************************************************************
# user src(s) file
#*********************************************************************************************************
USR_SRCS = \
SylixOS/user/main.c

#*********************************************************************************************************
# all bspmini2440 source
#*********************************************************************************************************
SRCS  = $(BSP_SRCS)
SRCS += $(DRV_SRCS)
SRCS += $(USR_SRCS)
SRCS += $(SYM_SRCS)

#*********************************************************************************************************
# build path
#*********************************************************************************************************
ifeq ($(DEBUG_LEVEL), debug)
OUTDIR = Debug
else
OUTDIR = Release
endif

OUTPATH = ./$(OUTDIR)
OBJPATH = $(OUTPATH)/obj
DEPPATH = $(OUTPATH)/dep

#*********************************************************************************************************
# target
#*********************************************************************************************************
O_IMG = $(OUTPATH)/ezN32926.elf
O_BIN = $(OUTPATH)/ezN32926.bin
O_SIZ = $(OUTPATH)/ezN32926.siz

#*********************************************************************************************************
# ezN32926 objects
#*********************************************************************************************************
OBJS = $(addprefix $(OBJPATH)/, $(addsuffix .o, $(basename $(SRCS))))
DEPS = $(addprefix $(DEPPATH)/, $(addsuffix .d, $(basename $(SRCS))))

#*********************************************************************************************************
# include path
#*********************************************************************************************************
INCDIR  = -I"$(SYLIXOS_BASE_PATH)/libsylixos/SylixOS"
INCDIR += -I"$(SYLIXOS_BASE_PATH)/libsylixos/SylixOS/include"
INCDIR += -I"$(SYLIXOS_BASE_PATH)/libsylixos/SylixOS/include/inet"

INCDIR += -I"./SylixOS"
INCDIR += -I"./SylixOS/bsp"

#*********************************************************************************************************
# compiler preprocess
#*********************************************************************************************************
DSYMBOL  = -DSYLIXOS
DSYMBOL += -D__BOOT_INRAM=1

#*********************************************************************************************************
# load script
#*********************************************************************************************************
LD_SCRIPT = SylixOSBSP.ld

#*********************************************************************************************************
# depend dynamic library
#*********************************************************************************************************
DEPEND_DLL = -lsylixos

#*********************************************************************************************************
# depend dynamic library search path
#*********************************************************************************************************
DEPEND_DLL_PATH = -L"$(SYLIXOS_BASE_PATH)/libsylixos/$(OUTDIR)"

#*********************************************************************************************************
# compiler optimize
#*********************************************************************************************************
ifeq ($(DEBUG_LEVEL), debug)
OPTIMIZE = -O0 -g3 -gdwarf-2
else
OPTIMIZE = -O2 -Os -g1 -gdwarf-2										# you can try use O3
endif

#*********************************************************************************************************
# rm command parameter
#*********************************************************************************************************
UNAME = $(shell uname -sm)

ifneq (,$(findstring Linux, $(UNAME)))
HOST_OS = linux
endif
ifneq (,$(findstring Darwin, $(UNAME)))
HOST_OS = darwin
endif
ifneq (,$(findstring Macintosh, $(UNAME)))
HOST_OS = darwin
endif
ifneq (,$(findstring CYGWIN, $(UNAME)))
HOST_OS = windows
endif
ifneq (,$(findstring windows, $(UNAME)))
HOST_OS = windows
endif

ifeq ($(HOST_OS),)
$(error Unable to determine HOST_OS from uname -sm: $(UNAME)!)
endif

#*********************************************************************************************************
# depends and compiler parameter (cplusplus in kernel MUST NOT use exceptions and rtti)
#*********************************************************************************************************
DEPENDFLAG  = -MM
CXX_EXCEPT  = -fno-exceptions -fno-rtti
COMMONFLAGS = $(CPUFLAGS) $(OPTIMIZE) -Wall -fmessage-length=0 -fsigned-char -fno-short-enums
ASFLAGS     = -x assembler-with-cpp $(DSYMBOL) $(INCDIR) $(COMMONFLAGS) -c
CFLAGS      = $(DSYMBOL) $(INCDIR) $(COMMONFLAGS) -c
CXXFLAGS    = $(DSYMBOL) $(INCDIR) $(CXX_EXCEPT) $(COMMONFLAGS) -c
ARFLAGS     = -r

#*********************************************************************************************************
# define some useful variable
#*********************************************************************************************************
DEPEND          = $(CC)  $(DEPENDFLAG) $(CFLAGS)
DEPEND.d        = $(subst -g ,,$(DEPEND))
COMPILE.S       = $(AS)  $(ASFLAGS)
COMPILE_VFP.S   = $(AS)  $(ASFLAGS) $(FPUFLAGS)
COMPILE.c       = $(CC)  $(CFLAGS)
COMPILE.cxx     = $(CXX) $(CXXFLAGS)

#*********************************************************************************************************
# target
#*********************************************************************************************************
all: $(O_IMG)
		@echo create "$(O_IMG) $(O_BIN)" success.

#*********************************************************************************************************
# include depends
#*********************************************************************************************************
ifneq ($(MAKECMDGOALS), clean)
ifneq ($(MAKECMDGOALS), clean_project)
sinclude $(DEPS)
endif
endif

#*********************************************************************************************************
# auto copy symbol.c symbol.h
#*********************************************************************************************************
EMPTY=
SPACE= $(EMPTY) $(EMPTY)
$(SYMBOL_PATH)/symbol.c:$(subst $(SPACE),\ ,$(SYLIXOS_BASE_PATH))/libsylixos/$(OUTDIR)/symbol.c
		cp "$(SYLIXOS_BASE_PATH)/libsylixos/$(OUTDIR)/symbol.c" $(SYMBOL_PATH)/symbol.c
		cp "$(SYLIXOS_BASE_PATH)/libsylixos/$(OUTDIR)/symbol.h" $(SYMBOL_PATH)/symbol.h

#*********************************************************************************************************
# create depends files
#*********************************************************************************************************
$(DEPPATH)/%.d: %.c
		@echo creating $@
		@if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
		@rm -f $@; \
		echo -n '$@ $(addprefix $(OBJPATH)/, $(dir $<))' > $@; \
		$(DEPEND.d) $< >> $@ || rm -f $@; exit;

$(DEPPATH)/%.d: %.cpp
		@echo creating $@
		@if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
		@rm -f $@; \
		echo -n '$@ $(addprefix $(OBJPATH)/, $(dir $<))' > $@; \
		$(DEPEND.d) $< >> $@ || rm -f $@; exit;

#*********************************************************************************************************
# compile source files
#*********************************************************************************************************
$(OBJPATH)/%.o: %.S
		@if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
		$(COMPILE.S) $< -o $@

$(OBJPATH)/%.o: %.c
		@if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
		$(COMPILE.c) $< -o $@

$(OBJPATH)/%.o: %.cpp
		@if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
		$(COMPILE.cxx) $< -o $@

#*********************************************************************************************************
# link ezN32926.elf object files
#*********************************************************************************************************
$(O_IMG): $(OBJS) $(LD_SCRIPT)
		$(LD) $(CPUFLAGS) -nostdlib $(addprefix -T,$(LD_SCRIPT)) -o $(O_IMG) $(OBJS) \
		$(DEPEND_DLL_PATH) $(DEPEND_DLL) -lm -lgcc
		$(OC) -O binary $(O_IMG) $(O_BIN)
		$(SZ) --format=berkeley $(O_IMG) > $(O_SIZ)

#*********************************************************************************************************
# clean
#*********************************************************************************************************
.PHONY: clean
.PHONY: clean_project

#*********************************************************************************************************
# clean objects
#*********************************************************************************************************
clean:
		-rm -rf $(O_SIZ)
		-rm -rf $(O_IMG)
		-rm -rf $(O_BIN)
		-rm -rf $(OBJS)
		-rm -rf $(SYMBOL_PATH)/symbol.c $(SYMBOL_PATH)/symbol.h
		-rm -rf $(OBJPATH)
		-rm -rf $(DEPPATH)

#*********************************************************************************************************
# clean project
#*********************************************************************************************************
clean_project:
		-rm -rf $(OUTPATH)

#*********************************************************************************************************
# END
#*********************************************************************************************************
